/**
 * js常用工具类
 */
(function (window, document, $) {
    /**
     * 通用工具类
     */
    window.common = {
        // 判断字符串是否为空
        isEmpty: function (value) {
            if (typeof value == "undefined" ||value == null || this.trim(value) == "") {
                return true;
            }
            return false;
        },
        // 判断一个字符串是否为非空串
        isNotEmpty: function (value) {
            return !common.isEmpty(value);
        },
        // 空对象转字符串
        nullToStr: function(value) {
            if (common.isEmpty(value)) {
                return "-";
            }
            return value;
        },
        // 是否显示数据 为空默认为显示
        visible: function (value) {
            if (common.isEmpty(value) || value == true) {
                return true;
            }
            return false;
        },
        // 空格截取
        trim: function (value) {
            if (value == null) {
                return "";
            }
            return value.toString().replace(/(^\s*)|(\s*$)|\r|\n/g, "");
        },
        // 比较两个字符串（大小写敏感）
        equals: function (str, that) {
            return str == that;
        },
        // 比较两个字符串（大小写不敏感）
        equalsIgnoreCase: function (str, that) {
            return String(str).toUpperCase() === String(that).toUpperCase();
        },
        // 将字符串按指定字符分割
        split: function (str, sep, maxLen) {
            if (common.isEmpty(str)) {
                return null;
            }
            var value = String(str).split(sep);
            return maxLen ? value.slice(0, maxLen - 1) : value;
        },
        // 字符串格式化(%s )
        sprintf: function (str) {
            var args = arguments, flag = true, i = 1;
            str = str.replace(/%s/g, function () {
                var arg = args[i++];
                if (typeof arg === 'undefined') {
                    flag = false;
                    return '';
                }
                return arg;
            });
            return flag ? str : '';
        },
        // 指定随机数返回
        random: function (min, max) {
            return Math.floor((Math.random() * max) + min);
        },
        // 判断字符串是否是以start开头
        startWith: function(value, start) {
            var reg = new RegExp("^" + start);
            return reg.test(value)
        },
        // 判断字符串是否是以end结尾
        endWith: function(value, end) {
            var reg = new RegExp(end + "$");
            return reg.test(value)
        },
        // 数组去重
        uniqueFn: function(array) {
            var result = [];
            var hashObj = {};
            for (var i = 0; i < array.length; i++) {
                if (!hashObj[array[i]]) {
                    hashObj[array[i]] = true;
                    result.push(array[i]);
                }
            }
            return result;
        },
        // 数组中的所有元素放入一个字符串
        join: function(array, separator) {
            if (common.isEmpty(array)) {
                return null;
            }
            return array.join(separator);
        },
        getDate: function (myDate) {
            function getNow(s) {
                return s < 10 ? '0' + s: s;
            }
            if(!myDate){
                myDate = new Date();
            }
            var year=myDate.getFullYear();        //获取当前年
            var month=myDate.getMonth()+1;   //获取当前月
            var date=myDate.getDate();            //获取当前日
            return year+'-'+getNow(month)+"-"+getNow(date);
        },
        // 补0
        prefixZero: function(num, n) {
            return (Array(n).join(0) + num).slice(-n);
        }
    }

    /**
     * 插件和相关操作的工具类
     */
    window.dm = {
        // 提示误消息
        msg: function(content) { layer.msg(content); },
        // 错误消息
        msgError: function(content) { layer.msg(content, {icon: 2, time: 3000, shift: 5 }); },
        // 成功消息
        msgSuccess: function(content) { layer.msg(content, {icon: 1, time: 1000, shift: 5 }); },
        // 警告消息
        msgWarning: function(content) { layer.msg(content, {icon: 0, time: 1000, shift: 5 }); },
        // 弹出提示
        alert: function(content, icon, callback) {
            layer.alert(content, {
                icon: icon,
                title: "系统提示",
                btn: ['确认'],
                btnclass: ['btn btn-primary'],
                yes: callback
            });
        },
        // 错误提示
        alertError: function(content, callback) { dm.alert(content, 2, callback); },
        // 成功提示
        alertSuccess: function(content, callback) { dm.alert(content, 1, callback); },
        // 警告提示
        alertWarning: function(content, callback) { dm.alert(content,0, callback); },
        // 确认提示框
        confirm: function (title,callback) {
            layer.confirm(title, {icon: 3, title:'提示'}, function(index){
                layer.close(index);
                callback();
            });
        },
        // get请求, 用于查询数据
        get: function(url, callback) {
            $.get(url, {}, callback, 'json');
        },
        // post请求，用于提交表单等功能，统一返回类型AjaxResult。
        post: function(url, data, callback) {
            $.ajax({url: url,type: 'post',dataType: 'json',data: data,
                beforeSend: function () {
                    // TODO 按钮的启用和禁用 layui和easyui
                    layer.load();
                },
                success: function(res) {
                    layer.closeAll("loading");
                    if (res.code === web_status.SUCCESS) {
                        window.top == window.parent ? dm.msgSuccess(res.msg) : parent.dm.msgSuccess(res.msg);
                        if (common.isNotEmpty(callback)) {
                            callback(res);
                        }
                    }else if (res.code === web_status.FAIL) {
                        console.log("error message:", res.msg);
                        dm.msgError(res.msg);
                    }else if (res.code === web_status.WARNING) {
                        console.log("error message:", res.msg);
                        dm.msgWarning(res.msg);
                    }else if (res.code === web_status.TIMEOUT) {
                        console.log("error message:", res.msg);
                        dm.alertWarning(res.msg, () => {
                            window.top.location = "/login"
                        });
                    }
                },
                complete: function(XMLHttpRequest, textStatus) {
                    layer.closeAll('loading');
                    if (XMLHttpRequest.status == 408) {
                        layer.msg("登录超时，请重新登录！", {icon: 0, time: 2000}, function () {
                            window.open('/login', '_top');
                        })
                    }else if (textStatus == 'timeout') {
                        dm.msgError("服务器超时，请稍后再试！");
                    } else if (textStatus == "parsererror" || textStatus == "error") {
                        dm.msgError("服务器错误，请联系管理员！");
                    }
                }
            });
        },
        // 表单提交方法
        save: function(formId, callback) {
            var form = $("#" + formId);
            if (form.form("validate")) {
                dm.post(form.attr("action"), dm.getFormJson(formId), callback)
            }
        },
        /**
         * 打开弹出窗口
         * @param title 弹出框标题
         * @param url 打开窗口的url
         * @param width 窗体宽度
         * @param height 窗体调度
         * @params btns 自定义按钮数组
         */
        openDialog: function (title, url, width, height, callback) {
            if (common.isEmpty(title)) title = false;
            if (common.isEmpty(url)) url = "/404.html";
            if (common.isEmpty(width)) width = 800;
            if (common.isEmpty(height)) height = ($(window).height() - 50);
            if (common.isEmpty(callback)) {
                callback = function(index, layero) {
                    var iframeWin = layero.find('iframe')[0];
                    iframeWin.contentWindow.submitHandler(index, layero);
                }
            }
            return layer.open({
                type: 2,
                area: [width + 'px', height + 'px'],
                fix: false,
                maxmin: true,
                shade: 0.3,
                title: title,
                content: url,
                btn: ['确定', '关闭'],
                yes: callback,
                cancel: function(index) {
                    return true;
                }
            });
        },
        // 打开无按钮的对话框
        openViewDialog: function (title, url, width, height) {
            if (common.isEmpty(title)) title = false;
            if (common.isEmpty(url)) url = "/404.html";
            if (common.isEmpty(width)) width = 800;
            if (common.isEmpty(height)) height = ($(window).height() - 50);
            return layer.open({
                type: 2,
                area: [width + 'px', height + 'px'],
                fix: false,
                maxmin: true,
                shade: 0.3,
                title: title,
                content: url
            });
        },
        // 选卡页方式打开
        openTab: function (title, url) {
            parent.layui.index.openTabsPage(url, title);
        },
        // 关闭选项卡
        closeTab: function () {
            layui.admin.events.closeThisTabs()
        },
        // 清空表单数据
        resetForm: function(id) {
            $("#" + id).form('clear');
        },
        // 获取form下所有的字段并转换为json对象
        getFormJson: function(formId) {
            var o = {};
            var a = $("#" + formId).serializeArray();
            $.each(a, function() {
                if (o[this.name] !== undefined) {
                    if (!o[this.name].push) {
                        o[this.name] = [ o[this.name] ];
                    }
                    o[this.name].push(this.value || '');
                } else {
                    o[this.name] = this.value || '';
                }
            });
            return o;
        },
        /**
         * 搜索，重新加载grid
         * @param gridId
         * @param params 表单ID或者参数对象
         * @param gridType grid类型：treegrid or datagird（可以为空,默认datagird）
         */
        search: function(gridId, params, gridType) {
            if (gridType == "treegrid") {
                // 如果是string类型 表示为查询条件所在的form表单的id 这种情况下
                // 会利用getFormJson(formId)方法将这些参数封装成json对象
                if (typeof (params) == "string")
                    $('#' + gridId).treegrid('load', dm.getFormJson(params));
                else if (typeof (params) == "undefined" || params=="" || params== null) // 表示不传递参数
                    $('#' + gridId).treegrid('load');
                else
                    // 表示params本身就是参数的json对象
                    $('#' + gridId).treegrid('load', params);
            } else {
                // 如果是string类型 表示为查询条件所在的form表单的id 这种情况下
                // 会利用getFormJson(formId)方法将这些参数封装成json对象
                if (typeof (params) == "string")
                    $('#' + gridId).datagrid('load', dm.getFormJson(params));
                else if (typeof (params) == "undefined") // 表示不传递参数
                    $('#' + gridId).datagrid('load');
                else
                    // 表示params本身就是参数的json对象
                    $('#' + gridId).datagrid('load', params);
            }
        },
        /**
         * 刷新当前页面，重新加载grid
         * @param gridId
         * @param params 表单ID或者参数对象
         */
        reLoad: function(gridId, params) {
            // 如果是string类型 表示为查询条件所在的form表单的id 这种情况下
            // 会利用getFormJson(formId)方法将这些参数封装成json对象
            if (typeof (params) == "string")
                $('#' + gridId).datagrid('reload', dm.getFormJson(params));
            else if (typeof (params) == "undefined") // 表示不传递参数
                $('#' + gridId).datagrid('reload');
            else
                // 表示params本身就是参数的json对象
                $('#' + gridId).datagrid('reload', params);
        },
        // datagrid获取选中的单行并执行回调，如果不传回调函数，则返回选中行
        getRow: function (gridId, callback) {
            var row;
            var opts = $('#'+gridId).datagrid('options');
            if (opts.singleSelect) {
                row = $('#'+gridId).datagrid('getSelected');
            } else {
                var rows = $('#'+gridId).datagrid('getSelections');
                if (!rows || rows.length > 1) {
                    row = false;
                } else {
                    row = rows[0];
                }
            }
            if (typeof callback == "function") {
                if (row) {
                    callback(row);
                } else {
                    layer.msg("请选择一行数据!");
                }
            } else {
                return row;
            }
        },
        // 获取gird中多选行中的某个属性，并以","拼接成的字符串
        // 如果不传回调函数，则返回选中行
        getRows: function (gridId, field, callback) {
            var rows = $('#'+gridId).datagrid('getSelections');
            var ids;
            if (rows && rows.length>0) {
                for(var i=0; i<rows.length; i++){
                    if(i==0) ids = rows[i][field]
                    else ids = ids + ',' + rows[i][field]
                }
            }
            if (typeof callback == "function") {
                if (rows && rows.length>0) {
                    callback(ids);
                } else {
                    layer.msg("请选择一行或多行数据!");
                }
            } else {
                return ids;
            }
        },
        // 初始化时不加载数据
        notLoadOnFirstTime: function () {
            var firstLoad = $(this).attr("firstLoad");
            if (firstLoad == "false" || typeof (firstLoad) == "undefined"){
                $(this).attr("firstLoad","true");
                return false;
            }
            return true;
        },
        /**
         * 合并EasyUI datagrid 单元格
         * @param datagridId
         * @param colList 要合并的单元格数组
         * @param judge 根据哪列合并
         * demo dm.mergeCellsByField('table','deptName,name,hgl,time','code');
         */
        mergeCellsByField: function(datagridId, colList, judge) {
            var columns = colList.split(",");
            var $datagrid = $('#' + datagridId);
            var totalNum = $datagrid.datagrid("getRows").length;//datagrid的长度
            var tmpA; //合并的行数
            var tmpB;
            var perText = "";
            var curText = "";
            var cur_judge ='';
            var per_judge='';
            for (var j = columns.length - 1; j >= 0; j--) {
                perText = "";
                tmpA = 1;
                tmpB = 0;
                for (var i = 0; i <= totalNum; i++) {
                    if (i == totalNum) {
                        curText = "";
                    } else {
                        curText = $datagrid.datagrid("getRows")[i][columns[j]];
                        cur_judge = $datagrid.datagrid("getRows")[i][judge];
                    }
                    if (perText == curText && per_judge == cur_judge ) {
                        tmpA += 1;
                    } else {
                        tmpB += tmpA;
                        $datagrid.datagrid('mergeCells', {
                            index: i - tmpA,
                            field: columns[j],
                            rowspan: tmpA,
                            colspan: null
                        });
                        tmpA = 1;
                    }
                    perText = curText;
                    per_judge = cur_judge;
                }
            }
        },
        //ztree
        /**
         * 打开树选择窗口（单选，双击选中）
         * @param title 弹出框标题
         * @param url 获取tree数据的url
         * @param selectId 当前选中的id
         * @param callback 回调函数
         */
        openTreeSelect: function(title, url, selectId, callback){
            var treeObj;
            var layerIndex = layer.open({
                type: 1,
                title: common.isEmpty(title)?"选择树":title,
                area: ["360px", "80%"],
                content: '<ul id="ztree" class="ztree" style="margin-left: 50px;margin-top: 10px"></ul>',
                btn: ['确认'],
                success: function(layero, index){
                    var setting = {
                        async: {
                            enable: true,
                            url: url
                        },
                        data: {
                            key: {title: "title"},
                            simpleData: {
                                enable: true,
                                idKey: "id",
                                pIdKey: "pid",
                                rootPId: 0
                            }
                        },
                        callback: {
                            onDblClick: function (event, treeId, treeNode) {
                                callback(treeNode);
                                layer.close(layerIndex);
                            },
                            onAsyncSuccess: function () {
                                if(common.isNotEmpty(selectId)){
                                    var node = treeObj.getNodeByParam("id", selectId, null);
                                    treeObj.selectNode(node);
                                }
                            }
                        }
                    };
                    treeObj = $.fn.zTree.init($("#ztree"), setting);
                },
                yes: function () {
                    var treeNode = treeObj.getSelectedNodes()[0]
                    if(!treeNode){
                        dm.msg("请选择一个节点");
                        return false;
                    }
                    callback(treeNode);
                    layer.close(layerIndex);
                }
            });
        },
        /**
         * 将easyui datebox设置为年-月形式
         * @param id
         */
        initMonthBox: function(id) {
            var db = $('#' + id);
            db.datebox({
                editable: false,
                onShowPanel: function () {//显示日趋选择对象后再触发弹出月份层的事件，初始化时没有生成月份层
                    span.trigger('click'); //触发click事件弹出月份层
                    if (!tds) setTimeout(function () {//延时触发获取月份对象，因为上面的事件触发和对象生成有时间间隔
                        tds = p.find('div.calendar-menu-month-inner td');
                        tds.click(function (e) {
                            e.stopPropagation(); //禁止冒泡执行easyui给月份绑定的事件
                            var year = /\d{4}/.exec(span.html())[0]//得到年份
                                , month = parseInt($(this).attr('abbr'), 10); //月份，这里不需要+1
                            db.datebox('hidePanel')//隐藏日期对象
                                .datebox('setValue', year + '-' + month); //设置日期的值
                        });
                    }, 0);
                    yearIpt.unbind();//解绑年份输入框中任何事件
                },
                parser: function (s) {
                    if (!s) return new Date();
                    var arr = s.split('-');
                    return new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, 1);
                },
                formatter: function (d) { return d.getFullYear() + '-' + common.prefixZero((d.getMonth() + 1),2);/*getMonth返回的是0开始的，忘记了。。已修正*/ }
            });
            var p = db.datebox('panel'), //日期选择对象
                tds = false, //日期选择对象中月份
                yearIpt = p.find('input.calendar-menu-year'),//年份输入框
                span = p.find('span.calendar-text'); //显示月份层的触发控件
            p.find('div.calendar-header').hide();
        }
    }
})(window, document, $);


/** 消息状态码 */
web_status = {
    SUCCESS: 200,
    WARNING: 301,
    TIMEOUT: 401,
    FAIL: 500
};
